ReadNCFile2 mit Token-Modifizierer
Das Beispielprojekt CNC12_TokenModifier.project
finden Sie im Installationsverzeichnis von CODESYS unter ..\CODESYS SoftMotion\Examples
.
Dieses Beispiel zeigt, wie Sie den G-Code beim Einlesen modifizieren können, um die Einheit der Bahngeschwindigkeit (F-Wort) von mm/min in mm/s umzuwandeln. Dies wird erreicht, indem Sie während des Einlesens des G-Codes beim F-Wort vor dem Geschwindigkeitswert den G-Code 1/60.0 *
einfügen. Aus F6000
wird dann F 1/60.0 * 6000
, was vom Funktionsbaustein SMC_NCInterpreter
dann zu F100
verarbeitet wird. In einfachen Fällen könnten Sie auf eine Multiplikation mit 1/60
verzichten und einfach den Wert, beispielsweise von 6000
auf 100
, anpassen. Die Multiplikation ist aber allgemeiner, da sie auch bei Verwendung von Variablen funktioniert. Aus F $SPEED$
wird F 1/60.0 * $SPEED$
.
Struktur der Applikation
Die Applikation besteht, wie für CNC-Applikationen üblich, aus einer Bahnverarbeitung (Programm CNC_PreparePath
) und der Interpolation (Programm CNC
). Da die Interpolation sich nicht von den anderen Beispielen unterscheidet, wird hier nicht weiter darauf eingegangen.
Die Bahnverarbeitung wird in der niederprioren Task PathTask
zyklisch alle 20 ms aufgerufen. Die Interpolation wird in der hochprioren Task MotionTask
zyklisch alle 4 ms aufgerufen. Für die Visualisierung wird die Hintergrund-Task VISU_TASK
definiert.
In der Visualisierung können Sie die Abarbeitung des G-Codes starten. Auf der rechten Seite der Visualisierung wird der G-Code und die Bewegung der Maschine (3D-Portals) dargestellt.
Der G-Code
CNC_PathSpeed
N10 G01 X1000 F6000 N20 Y1000
In diesem G-Code wird die Bahngeschwindigkeit in Satz N10
mit F6000
auf 6000 mm/min vorgegeben. Die Bausteine der CNC erwarten jedoch die Bahngeschwindigkeit in mm/s. Es werden zwei lineare Bewegungen kommandiert, zuerst nach X=1000
, dann nach X=1000, Y=1000
.
Token-Verarbeitung
Die Bausteine SMC_ReadNCFile2
und SMC_ReadNCFromStream
bieten die Möglichkeit, beim Einlesen des G-Codes eigene Transformationen durchzuführen. Hier beschäftigen wir uns mit der Schnittstelle SMC_ITokenModifier
, die über den Eingang aTokenModifier
übergeben wird.
Diese Schnittstelle arbeitet auf sogenannten "Token". Das sind die Grundbestandteile des G-Codes, in die der G-Code-Text zu Beginn der Verarbeitung zerlegt wird.
N50 G36 O$plc_variable$ D'TextTest' X-1 (Comment)
Dieser G-Code wird folgendermaßen zerlegt:
Text | SMC_TOKENTYPE | SMC_TOKENVALUE |
---|---|---|
| identifer | stValue = 'N' |
| number | fValue = 50.0 |
| identifer | stValue = 'G' |
| number | fValue = 36.0 |
| identifer | stValue = 'O' |
| variable | stValue = 'plc_variable' |
| identifer | stValue = 'D' |
| strLiteral | stValue = 'TextTest' |
| identifer | stValue = 'X' |
| operator | stValue = '-' |
| number | fValue = 1.0 |
Für die weitere Verarbeitung nicht benötigte Informationen, wie Whitespace-Zeichen, Zeilenumbrüche oder Kommentare, kommen in der Liste der Tokens nicht vor.
Wenn die Schnittstelle SMC_ITokenModifier
implementiert wird, kann die Liste der Tokens durch Einfügen neuer Tokens, Löschen von Tokens und Änderung des Werts von Tokens angepasst werden.
Start
: Initialisierung des Bausteins. Der interne Zustand wird zurückgesetzt.Call
: Aufruf dieser Methode während der Abarbeitung des G-Codes. Token können aus der Eingangs-Queue gelesen und entfernt werden und in die Ausgangs-Queue eingefügt werden.
Umsetzung
Alle Token werden von der Eingangs-Queue in die Ausgangs-Queue verschoben.
Wenn ein F-Word enthalten ist, werden nach dem Token für "F" und vor dem Token für den Wert der Geschwindigkeit zwei neue Token
1/60
und*
eingefügt.
Die Methode Call
enthält die Logik, um die Tokens zu verarbeiten. Es ist hilfreich, die Token der Eingangs-Queue (tokensIn
) zunächst in eine temporäre Queue (m_tmpQueue
) zu verschieben, dort zu verarbeiten und danach in die Ausgangs-Queue (tokensOut
) zu verschieben. Für die Anpassung der Bahngeschwindigkeit ist die temporäre Queue nicht unbedingt nötig, vereinfacht aber die Programmstruktur in komplizierteren Fällen.
Methode Call
Zu Beginn wird im Zustand STATE_RUNNING
gewartet, bis die Bearbeitung starten kann, also bis Token in der Eingangs-Queue vorhanden sind und gleichzeitig noch Platz in der Ausgangs-Queue ist.
IF NOT SMC_NC_CanProcessTokens(tokensIn, tokensOut) THEN // Wait until processing can proceed RETURN; END_IF
Danach wird ein Token aus der Eingangs-Queue in die temporäre Queue verschoben.
IF m_tmpQueue.IsEmpty() THEN // Move the next token from the in-queue to the tmp-queue. pt := tokensIn.GetFromStart(0); m_tmpQueue.Append(pt^); tokensIn.RemoveFirst(); END_IF
Die eigentliche Verarbeitung erfolgt dann in der Methode ConvertSpeed
.
IF NOT m_tmpQueue.IsEmpty() THEN // The actual processing is done here ConvertSpeed(); END_IF
Am Ende der Methode wird dann ein Token aus der temporären Queue in die Ausgangs-Queue verschoben.
Methode ConvertSpeed
Es wird das erste Token aus der temporären Queue geprüft.
Wenn ein Bezeichner mit Wert F
gefunden wird, dann werden zwei zusätzliche Token eingefügt: die Zahl 1/60.0
und der Operator *
.
(Die Größe der temporären Queue ist so gewählt, dass neben dem einen Token aus der Eingangs-Queue noch zwei weitere Token in die Queue passen.)
tk := m_tmpQueue.GetFromStart(0)^; IF tk.tokenType = SMC_TokenType.identifier THEN tk.GetString(pbyString => pby, iSize => iSize); // 70 = ASCII code for F (path velocity) IF iSize = 1 AND pby^ = 70 THEN // Insert the number 1/60 SMC_Token_InitNumber( tk:= tkNumber, value:= 1/60.0, srcPos:= tk.srcPos); m_tmpQueue.Append(tkNumber); // Insert operator '*' for multiplication SMC_Token_InitOperator( tk:= tkOperator, value:= '*', srcPos:= tk.srcPos); m_tmpQueue.Append(tkOperator); END_IF END_IF
Inbetriebnahme
Übersetzen Sie die Applikation und laden Sie sie auf eine Steuerung.
Starten Sie die Applikation, wechseln Sie zur Visualisierung und drücken Sie auf
Start
.